package com.ckx.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ckx.constants.SystemConstants;
import com.ckx.domain.dto.TagDto;
import com.ckx.domain.entity.Tag;
import com.ckx.domain.vo.PageVo;
import com.ckx.domain.vo.TagVo;
import com.ckx.enums.AppHttpCodeEnum;
import com.ckx.exception.SystemException;
import com.ckx.mapper.TagMapper;
import com.ckx.service.TagService;
import com.ckx.utils.BeanCopyUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

@Service
public class TagServiceImpl extends ServiceImpl<TagMapper, Tag> implements TagService {

    @Override
    public PageVo listByPage(Integer pageNum, Integer pageSize, TagDto tagDto) {
        Tag tag = BeanCopyUtil.copyBean(tagDto, Tag.class);
        //分页查询
        QueryWrapper<Tag> wrapper = new QueryWrapper<>();
        wrapper.lambda().like(StringUtils.hasText(tag.getName()), Tag::getName, tagDto.getName());
        wrapper.lambda().like(StringUtils.hasText(tag.getRemark()), Tag::getRemark, tagDto.getRemark());
//        wrapper.lambda().eq(Tag::getDelFlag, SystemConstants.NOT_DELFLAG);
        Page<Tag> page = new Page<>(pageNum, pageSize);
        page(page, wrapper);
        //封装vo
        return new PageVo(page.getRecords(), page.getTotal());

    }

    @Override
    public void addTag(TagDto tagDto) {

        if (Objects.isNull(tagDto)) {
            throw new SystemException(AppHttpCodeEnum.ARGS_FAIL);
        }
        Tag tag = BeanCopyUtil.copyBean(tagDto, Tag.class);
        this.save(tag);

    }

    @Override
    public void logicDelTag(Long[] ids) {

        UpdateWrapper<Tag> wrapper = new UpdateWrapper<>();
        wrapper.lambda().set(Tag::getDelFlag, SystemConstants.DELFLAG);
        wrapper.lambda().in(Tag::getId, ids);
        this.update(wrapper);

    }

    @Override
    public TagVo getInfo(Long id) {
        Tag tag = this.getById(id);
        if (Objects.isNull(tag)) {
            throw new SystemException(AppHttpCodeEnum.ARGS_FAIL);
        }
        return BeanCopyUtil.copyBean(tag, TagVo.class);
    }

    @Override
    public void updateTag(TagDto tagDto) {
        Tag tag = BeanCopyUtil.copyBean(tagDto, Tag.class);

        UpdateWrapper<Tag> wrapper = new UpdateWrapper<>();
        wrapper.lambda().set(Tag::getName, tag.getName());
        wrapper.lambda().set(Tag::getRemark, tag.getRemark());
        wrapper.lambda().eq(Tag::getId, tag.getId());
        this.update(tag, wrapper);

    }

    @Override
    public List<TagVo> listAllTag() {

        QueryWrapper<Tag> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(Tag::getDelFlag, SystemConstants.NOT_DELFLAG);
        List<Tag> tags = this.getBaseMapper().selectList(wrapper);
        return tags.stream()
                .map(tag -> BeanCopyUtil.copyBean(tag, TagVo.class))
                .collect(Collectors.toList());

    }


}
